使用捏合操纵器

使用捏合操纵器可以使用户在 Kanzi 应用程序中缩放和旋转节点。例如,您可以使用捏合操纵器让用户缩放图形。请参阅为节点启用捏合手势

使用 捏合操纵器 (Pinch Manipulator) 触发器响应捏合手势。例如,您可以设置用户通过捏合手势缩放和旋转节点时的节点外观。请参阅使用捏合操纵器 (Pinch Manipulator) 触发器

捏合操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。您可以通过 Kanzi Engine API 分配输入操纵器。请参阅使用输入操纵器

通过完成教程学习如何使用捏合操纵器。请参阅教程:平移、缩放、轻敲

为节点启用捏合手势

要为节点启用捏合手势:

  1. Kanzi Studio 中使用应用程序 (Application) 模板创建工程。
  2. 工程 (Project) 中创建要启用捏合手势的节点。
    例如,创建一个图像 (Image) 节点并将其命名为 PinchNode
  3. 工程 (Project) 中选择您在上一步中创建的节点,在属性 (Properties) 中添加可测试命中 (Hit Testable) 属性,并将其设置为启用。
    当您启用属性时,用户能选取节点。
    默认情况下,按钮 (Button)列表框项容器 (List Box Item Container)滚动视图 (Scroll View)滑块 (Slider) 节点启用命中测试。 请参阅定义哪个节点接收用户输入
  4. 工程 (Project)按下 Alt 并右键点击 您创建的节点并选择别名 (Alias)
    Kanzi Studio 会创建一个别名(它指向您从中创建该别名的节点),并将该别名添加到它的含资源字典的最近祖先节点的资源字典中。
    使用 # 符号后跟别名名称访问别名目标节点。
  5. 选择文件 (File) > 导出 (Export) > 导出 KZB (Export KZB)
    Kanzi StudioKanzi Studio 工程创建 kzb 文件和配置文件。Kanzi Studio 将导出的文件存储在 <ProjectName>/Application/bin 目录或您在 工程 (Project) > 属性 (Properties)二进制导出目录 (Binary Export Directory) 属性中指定的位置。Kzb 文件包含 Kanzi Studio 工程中的所有节点和资源,您在本地化表中标记为本地化包的资源除外。
    当您从 Visual Studio 中运行您的 Kanzi 应用程序时,您的应用程序就会加载 kzb 文件和配置文件。
  6. 在 Visual Studio 中打开存储在 <ProjectName>/Application/configs/platforms/win32 中的解决方案,并在实现应用程序逻辑的文件中创建并配置捏合操纵器:
    1. 为捏合消息定义处理程序。
      例如,在实现应用程序逻辑的类的 public 部分后添加:
      private: 
      
          //为 PinchManipulator::StartedMessage 消息定义处理程序,该消息来自 
          //具有可生成捏合消息的输入操纵器的 2D 节点。
          //此处理程序可为捏合手势准备 2D 节点。
          void onPinchStarted(PinchManipulator::StartedMessageArguments& messageArguments)
          {
              //从消息参数获得用户捏合的节点。
              Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
      
              if (!node2d)
              {
                  return;
              }
      
              //当开始节点上的捏合手势,让节点位于前面。
              node2d->moveToFront();
      
              //存储渲染变换 (Render Transformation) 比例的初始值。
              SRTValue2D nodeTransform = node2d->getRenderTransformation();
              m_pinchInitialScaleFactor = nodeTransform.getScale().getX() - 1.0f;
          }
      
          //定义 PinchManipulator::MovedMessage 消息的处理程序,该消息来自
          //具有可生成捏合消息的输入操纵器的 2D 节点。
          //这样可按捏合手势的量缩放和旋转 2D 节点。
          void onPinchMoved(PinchManipulator::MovedMessageArguments& messageArguments)
              {
              //从消息参数获得用户捏合的节点。
              Node2DSharedPtr node2d = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
      
              if (!node2d)
              {
                  return;
              }
      
              float scale;
      
              //从消息参数获取比例和旋转。
              float scaleDelta = messageArguments.getScale();
              float rotateDelta = messageArguments.getRotation();
      
              //获取节点的渲染变换 (Render Transformation) 属性。
              SRTValue2D nodeTransform = node2d->getRenderTransformation();
      
              //通过添加初始比例到捏合值计算比例。
              scale = scaleDelta + m_pinchInitialScaleFactor;
      
              //应用旋转。
              nodeTransform.rotate(rotateDelta);
      
              //应用比例。
              nodeTransform.setScale(Vector2(scale, scale));
      
              //要让节点围绕中心而非左上角旋转,
              //将渲染变换原点 (Render Transformation Origin) 属性设置为 (0.5, 0.5)。
              node2d->setRenderTransformationOrigin(Vector2(0.5f, 0.5f));
      
              //应用新变换到节点。
              node2d->setRenderTransformation(nodeTransform);
          }
      
          //捏合手势的初始比例因子。
          float m_pinchInitialScaleFactor;
    2. 在实现应用程序逻辑的类的 public 部分,添加构造函数并为捏合手势设置初始比例因子:
          MyProject() : 
              m_pinchInitialScaleFactor(0.0f)
          {
          }
    3. onProjectLoaded() 函数中创建 PinchManipulator 操纵器并订阅其消息。
      例如,添加:
          virtual void onProjectLoaded() KZ_OVERRIDE
          {
              ScreenSharedPtr screen = getScreen();
              Domain* domain = getDomain();
      
              //使用别名获取PinchNode 节点。
              NodeSharedPtr pinchNode = screen->lookupNode<Node>("#PinchNode");
      
              //创建生成捏合消息的输入操纵器。
              PinchManipulatorSharedPtr pinchManipulator = PinchManipulator::create(domain);
      
              //添加输入操纵器到PinchNode。
              pinchNode->addInputManipulator(pinchManipulator);
      
              //订阅PinchNodePinchManipulator::StartedMessage 消息。
              // PinchManipulator 在用户在附加节点按下两根手指时生成此消息。
              pinchNode->addMessageHandler(PinchManipulator::StartedMessage, bind(&MyProject::onPinchStarted, this, placeholders::_1));
      
              //订阅 PinchNodePinchManipulator::MovedMessage 消息。
              //PinchManipulator 在超出比例或旋转阈值时首次生成此消息,
              //然后在被跟踪触摸在更新之间移动时生成此消息。
              pinchNode->addMessageHandler(PinchManipulator::MovedMessage, bind(&MyProject::onPinchMoved, this, placeholders::_1));
         }
  7. 构建和运行应用程序。 请参阅部署 Kanzi 应用程序
    在应用程序中缩放或旋转已启用捏合手势的节点。

使用捏合操纵器 (Pinch Manipulator) 触发器

使用 捏合操纵器 (Pinch Manipulator) 触发器响应捏合手势。例如,您可以设置用户通过捏合手势缩放和旋转节点时的节点外观。

捏合操纵器 (Pinch Manipulator) 有这些触发器:

要使用捏合操纵器 (Pinch Manipulator) 触发器:

  1. 为节点启用捏合手势。请参阅为节点启用捏合手势
  2. 定义您想通过捏合操纵器 (Pinch Manipulator) 触发器设置的行为。
    例如,创建状态机,您可以定义状态以设置节点在捏合已移动 (Pinch Moved)捏合已完成 (Pinch Finished) 触发器被触发时的外观。请参阅创建状态机
  3. 添加和配置捏合操纵器 (Pinch Manipulator) 触发器:
    1. 工程 (Project) 中,选择要为其添加触发器的节点,并在节点组件 (Node Components) > 触发器 (Triggers) 部分添加其中一个捏合操纵器 (Pinch Manipulator) 触发器。
      例如,在工程 (Project) 中选择启用捏合手势的节点,并在节点组件 (Node Components) 中添加捏合已移动 (Pinch Moved) 触发器。
    2. 在您在上一步创建的触发器中,点击 触发器设置 (Trigger Settings) 并在 触发器设置编辑器 (Trigger Settings Editor) 中禁用 设置已处理消息 (Set Message Handled) 属性。
      当您禁用 设置已处理消息 (Set Message Handled) 属性,此触发器拦截消息,但不会停止消息。这样您可以让输入操纵器处理该消息。
    3. 在您创建的触发器中,选择 添加 (Add) 下拉菜单中的动作,并配置该动作。
      例如,选择转到状态 (Go to State) 动作并在动作设置中设置:
      • 项 (Item) 设为已启用捏合手势的节点
      • 状态 (State) 设为设置节点在捏合已移动 (Pinch Moved) 触发器被触发时的外观的状态
  4. 重复上一步,以添加并配置更多捏合操纵器 (Pinch Manipulator) 触发器。
    例如,添加捏合已完成 (Pinch Finished) 触发器,在触发器的转到状态 (Go to State) 动作中,将状态 (State) 设置为当触发器被触发时设置节点外观的状态。
  5. 选择文件 (File) > 导出 (Export) > 导出 KZB (Export KZB)
  6. 构建和运行应用程序。 请参阅部署 Kanzi 应用程序
    在应用程序中缩放或旋转已启用捏合手势的节点。

在 API 中使用捏合操纵器

有关详细信息,请参阅 API reference中的 PinchManipulator 类。

另请参阅

教程:平移、缩放、轻敲

处理用户输入

使用平移操纵器

使用滚动视图 (Scroll View) 节点

部署 Kanzi 应用程序

使用触发器